package ar.edu.utn.frgp.banco.dao.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import ar.edu.utn.frgp.banco.dao.PrestamoDao;
import ar.edu.utn.frgp.banco.domain.Prestamo;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;
import ar.edu.utn.frgp.banco.exceptions.PersonalisedException;
import ar.edu.utn.frgp.banco.exceptions.ServiceException;
import ar.edu.utn.frgp.banco.utils.Constantes;


/**
 * Esta clase utiliza el patron Singletone.
 * @author PUSDERKIS
 *
 */
public class PrestamoDaoImpl extends GenericDaoImpl implements PrestamoDao {

	@Override
	
	public Boolean crearPrestamo(String dni, Date fecha, BigDecimal monto, Integer cant, BigDecimal interes ) throws DataAccessException{
		
		Connection con = null;
		
		String consulta = "INSERT INTO prestamos (dni,fecha_alta,monto,cant_cuotas,interes,activo) VALUES(?,?,?,?,?,?)";
		
		PreparedStatement st = null;
		ResultSet rs = null;
		
		try {
			con = getConection();
			st = con.prepareStatement(consulta);
			
			java.sql.Date date = new java.sql.Date(fecha.getTime());
			
			st.setString(1, dni);
			st.setDate(2, date);
			st.setBigDecimal(3, monto);
			st.setInt(4, cant);
			st.setBigDecimal(5, interes);
			st.setInt(6, 1); //el prestamo esta activo
			
			st.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(Constantes.EXCEPCION_CONEXION_BD,e.getCause());
		} finally {
			closeResultSet(rs);
			closeStatement(st);
			closeConnection();
		}
		
		return true;
	}
	
	public Prestamo obtenerPrestamo(String dni) throws DataAccessException {
		// TODO Auto-generated method stub
		
		Connection con = null;
		Prestamo prestamo = new Prestamo();
		
		String consulta = "SELECT id_prestamo,dni,fecha_alta,monto,cant_cuotas,interes,activo FROM prestamos WHERE dni = ? ORDER BY fecha_alta DESC";
			
		PreparedStatement st = null;
		ResultSet rs = null;
		
		try {
			con = getConection();
			st = con.prepareStatement(consulta);
			st.setString(1, dni);
			
			rs = st.executeQuery();
			
			if (rs.next()) { //agregar comprobar que este activo el prestamo
				prestamo.setId(rs.getLong(1));
				prestamo.setDni(rs.getString(2));
				prestamo.setFechaAlta(rs.getDate(3));
				prestamo.setMonto(rs.getBigDecimal(4));
				prestamo.setCantidadCuotas(rs.getInt(5));
				prestamo.setInteres(rs.getBigDecimal(6));
				prestamo.setEstado(rs.getBoolean(7));
			}
			else{
				//si la consulta no devuelve ningun prestamo , devuelve NULL
				return null;
			}
					
			
				
			
		}catch (SQLException e) {
			throw new DataAccessException(Constantes.EXCEPCION_CONEXION_BD,e.getCause());
		} finally {
			closeResultSet(rs);
			closeStatement(st);
			closeConnection();
		}
		
		return prestamo;
	}
		
	public Integer obtenerNumCuotas(Long id) throws PersonalisedException {
		// TODO Auto-generated method stub
		
		Connection con = null;
		
		String consulta = "SELECT COUNT(*) FROM pago_prestamos WHERE id_prestamo = ?";
			
		PreparedStatement st = null;
		ResultSet rs = null;
		
		try {
			con = getConection();
			st = con.prepareStatement(consulta);
			st.setLong(1, id);
			
			rs = st.executeQuery();
			
			rs.next();
			
			return rs.getInt(1);
			
		}catch (SQLException e) {
			throw new ServiceException(Constantes.EXCEPCION_CONEXION_BD,e.getCause());
		} finally {
			closeResultSet(rs);
			closeStatement(st);
			closeConnection();
		}
		
	}
	
	public void finalizarPrestamo(Long idPrestamo) throws DataAccessException{
		Connection con = null;
		
		String consulta = "UPDATE prestamos SET activo = 0 WHERE id_prestamo = ?";
			
		PreparedStatement st = null;
		
		try {
			con = getConection();
			st = con.prepareStatement(consulta);
			st.setLong(1, idPrestamo);
			
			st.executeUpdate();
			
		}catch (SQLException e) {
			throw new DataAccessException(Constantes.EXCEPCION_CONEXION_BD,e.getCause());
		} finally {
			closeStatement(st);
		}
	}
	
	public Boolean estaActivo(String dni) throws DataAccessException{
		Connection con = null;
		
		String consulta = "SELECT activo FROM prestamos WHERE dni = ?";
			
		PreparedStatement st = null;
		ResultSet rs = null;
		
		try {
			con = getConection();
			st = con.prepareStatement(consulta);
			st.setString(1, dni);
			
			rs = st.executeQuery();
			
			rs.next();
			
			if(rs.getInt(1) == 1)
				return true;
			else
				return false;
			
		}catch (SQLException e) {
			throw new DataAccessException(Constantes.EXCEPCION_CONEXION_BD,e.getCause());
		} finally {
			closeResultSet(rs);
			closeStatement(st);
			closeConnection();
		}
		
	}
	
}
